//方法调用模式
// 创建myObject方法，它有一个 value 属性和一个 getnum 方法
// getnum 方法有一个可选的参数，如果参数不是数字，默认数字是1.
var myObject={
    value: 0,
    getnum: function (num) {
        // this 绑定的当前对象 myObject
        this.value+=typeof num === 'number' ? num : 1 ;
    }
};

myObject.getnum();
document.writeln(myObject.value);  // 1

myObject.getnum(2);
document.writeln(myObject.value);  // 3

//函数调用模式
//给 myObject 增加一个 double 方法
myObject.double = function () {
    var that = this;  // 解决方法

    var helper = function () {
        // that 获得当前对象
        that.value=that.value+that.value;
    };

    helper();  //以函数的形式调用 helper
};
// 以方法的形式调用 double
myObject.double();
document.writeln(myObject.value);  //6

// 构造器调用模式
//创建一个名为 Quo 的构造器函数，它构造一个带有 status 属性的对象
var Quo = function (string) {
    this.status=string;
}
//给 Que 的所有实例提供一个名为 get_status 的公共方法。
Quo.prototype.get_status = function () {
    return this.status;
}
// 构造一个 Quo 实例
var myQue = new Quo("confused");
document.writeln(myQue.get_status());  //confused

//构造一个名为quo的构造函数
//它构造出带有get_status 方法和 status私有属性的一个对象
var quo = function (status) {
    return {
        get_status: function (){
            return status;
        }
    }
}
// 构造一个quo实例
var myQuo = quo("amazed");
document.writeln(myQuo.get_status());


// Apply 调用模式
var statusObject = {
    status: 'A-OK'
};
//status 值为 'A-OK'
var status = Quo.prototype.get_status.apply(statusObject);

//给函数增加 method 方法
Function.prototype.method= function (name,func){
    // 增加之前先判断是否已经存在
    if(!this.prototype[name]){
        this.prototype[name]=func;
    }
}

// 给number 增加判断数字的正负来取整的方法
Number.method('integer',function() {
   return Math[this<0 ? 'ceil' : 'floor'](this);
});
document.writeln((-10/3).integer());  //-3

// 字符串添加移除末端空白方法
String.method('trim',function(){
    return this.replace(/^\s+|\s+$/g,'');
});
document.writeln('"'+"  neat  ".trim()+'"');


// 模块模式
String.method('deentityify',function(){
// 字符实体表
var entity = {
    quot:'"',
    lt: '<',
    gt: '>'
};

//返回 deentityify 方法
return function(){
    return this.replace(/&([^&;]+);/g,
    function(a,b) {
        var r= entity[b];
        return typeof r==='string' ?r :a;
    }
    );
};
}());

document.writeln('&lt;&quot;&gt;'.deentityify());   //<">


// 一般化记忆
var memoizer = function (memo,fundamental) {
    var shell = function (n) {
        var result = memo[n];
        if(typeof result !=='number'){
            result = fundamental(shell,n);
            memo[n] = result;
        }
        return result;
    };
    return shell;
};

// 定义 fibonacci 函数
var fibonacci = memoizer([0,1], function (shell,n){
    return shell(n-1)+shell(n-2);
});